package com.yyfax.ph.common.utils;

import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.RectF;
import android.text.TextUtils;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.QRCodeWriter;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;

import java.util.HashMap;
import java.util.Map;

/**
 * 二维码生成工具类
 * Created by laixj on 2017/9/12.
 * Copyright ©2017 www.yylending.com. All Rights Reserved.
 */

public class QRCodeUtil {
	private final static String TAG = "QRCodeUtil";

	/**
	 * 生成二维码Bitmap
	 *
	 * @param content 内容
	 * @param widthPix 图片宽度
	 * @param heightPix 图片高度
	 * @param logoBm 二维码中心的Logo图标（可以为null）
	 * @param density
	 * @return 生成二维码及保存文件是否成功
	 */
	public static Bitmap createQRImage(String content, int widthPix, int heightPix, Bitmap logoBm, float density) throws Exception {
		if (TextUtils.isEmpty(content)) {
			return null;
		}
		//配置参数
		Map hints = new HashMap<>();
		hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
		//容错级别
		hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
		//设置空白边距的宽度
		hints.put(EncodeHintType.MARGIN, 0); //default is 4
		// 图像数据转换，使用了矩阵转换
		BitMatrix bitMatrix = new QRCodeWriter().encode(content, BarcodeFormat.QR_CODE, widthPix, heightPix, hints);
		int[] pixels = new int[widthPix * heightPix];
		// 下面这里按照二维码的算法，逐个生成二维码的图片，
		// 两个for循环是图片横列扫描的结果
		for (int y = 0; y < heightPix; y++) {
			for (int x = 0; x < widthPix; x++) {
				if (bitMatrix.get(x, y)) {
					pixels[y * widthPix + x] = 0xff000000;
				} else {
					pixels[y * widthPix + x] = 0xffffffff;
				}
			}
		}
		// 生成二维码图片的格式，使用ARGB_8888
		Bitmap bitmap = Bitmap.createBitmap(widthPix, heightPix, Bitmap.Config.ARGB_8888);
		bitmap.setPixels(pixels, 0, widthPix, 0, 0, widthPix, heightPix);
		if (logoBm != null) {
			bitmap = addLogo(bitmap, logoBm, density);
		}
		//必须使用compress方法将bitmap保存到文件中再进行读取。直接返回的bitmap是没有任何压缩的，内存消耗巨大！
		return bitmap;
	}
	/**
	 * 在二维码中间添加Logo图案
	 */
	private static Bitmap addLogo(Bitmap src, Bitmap logo, float density) {
		if (src == null) {
			return null;
		}
		if (logo == null) {
			return src;
		}
		//获取图片的宽高
		int srcWidth = src.getWidth();
		int srcHeight = src.getHeight();
		int logoWidth = logo.getWidth();
		int logoHeight = logo.getHeight();
		if (srcWidth == 0 || srcHeight == 0) {
			return null;
		}
		if (logoWidth == 0 || logoHeight == 0) {
			return src;
		}
		//logo大小为二维码整体大小的1/5
		float scaleFactor = srcWidth * 1.0f / 5 / logoWidth;
		Bitmap bitmap = Bitmap.createBitmap(srcWidth, srcHeight, Bitmap.Config.ARGB_8888);
		try {
			Canvas canvas = new Canvas(bitmap);
			canvas.drawBitmap(src, 0, 0, null);
			canvas.scale(scaleFactor, scaleFactor, srcWidth / 2, srcHeight / 2);
			Paint paint = new Paint();
			paint.setARGB(255, 255, 255, 255);
			paint.setAntiAlias(true);
			int whiteWidth = (int)(5 * density);
			int whiteRadius = (int)(10 * density);
			canvas.drawRoundRect(new RectF((srcWidth - logoWidth) / 2 - whiteWidth, (srcHeight - logoHeight) / 2 - whiteWidth, (srcWidth - logoWidth) / 2 + logoWidth + whiteWidth,
					(srcHeight - logoHeight) / 2 + logoHeight + whiteWidth), whiteRadius, whiteRadius, paint);
			canvas.drawBitmap(logo, (srcWidth - logoWidth) / 2, (srcHeight - logoHeight) / 2, null);
			canvas.save(Canvas.ALL_SAVE_FLAG);
			canvas.restore();
		} catch (Exception e) {
			bitmap = null;
			e.getStackTrace();
		}
		return bitmap;
	}
}
